package JDBC;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据库操作类
 * 里面有各个功能对应的数据库操作
 * 使用的数据库:scoredatabase
 * 使用的表:score_table
 *
 *  "*******"标记处为添加前端跳转页面功能的地方
 *
 * @Author Alex
 */
public class SQLHandler {

    /**
     * 插入成绩信息
     * 输入学生的name,score,id设为null组成一个Score类
     * 插入数据库,id由数据库自动生成
     *
     */
    public static void insertScore(Score score) throws SQLException, ClassNotFoundException {
        //获取连接
        Connection con = JDBCUtils.get();
        //获取传输器
        String sql = "insert into score_table values(?,?,?)";
        PreparedStatement ps = con.prepareStatement(sql);
        //name和score会从网页的输入框中获取值
        ps.setObject(1,null);
        ps.setObject(2,score.getName());
        ps.setObject(3,score.getScore());
        //执行sql语句
        ps.executeUpdate();

        System.out.println("插入成功!!");//打桩记得删除,可加入添加成功的提示信息功能**********

        //关闭资源
        JDBCUtils.close(con,ps,null);
    }

    /**
     * 查询成绩
     * 查询所有的成绩信息,返回一个Score集合
     *
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static List<Score> queryAllScore() throws SQLException, ClassNotFoundException {
        //获取连接器
        Connection con = JDBCUtils.get();
        //获取传输器
        String sql = "select id,name,score from score_table";
        PreparedStatement ps = con.prepareStatement(sql);
        //执行sql语句,获取结果集
        ResultSet rs = ps.executeQuery();
        //当查询出结果时,解析出每一组数据的信息
        List<Score> scoreList = new ArrayList<>();
        while(rs.next()){
            //当查询出结果时,解析结果集,得到该学生的全部信息
            Integer rsId = (Integer) rs.getObject(1);
            String rsName = (String) rs.getObject(2);
            Integer rsScore = (Integer) rs.getObject(3);
            //此处需要一个学生集合来接收
            Score s = new Score(rsId,rsName,rsScore);
            scoreList.add(s);
        }
        //关闭资源
        JDBCUtils.close(con,ps,rs);
        return scoreList;
    }

    /**
     * 查询单个成绩
     * 输入id查询单个学生的成绩
     * 查询失败时score会是null,可以根据score是否为null判断查询失败 (if(score=null).....)
     *
     * ----查询成功时会返回一个Score对象,接收后要传到前端展示(if(score!=null))
     *
     * @return Score
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static Score queryScore(Integer id) throws SQLException, ClassNotFoundException {
        //获取连接器
        Connection con = JDBCUtils.get();
        //获取传输器
        String sql = "select id,name,score from score_table where id = ?";
        PreparedStatement ps = con.prepareStatement(sql);
        //id从网页输入框中获取
        ps.setObject(1, id);
        //执行sql语句,获取结果集
        ResultSet rs = ps.executeQuery();
        Score score = null;
        if (rs.next()) {
            //由于id是唯一的,本次查询最多只会出现一个结果
            //当查询出结果时,解析结果集,得到该学生的全部信息
            Integer rsId = (Integer) rs.getObject(1);
            String rsName = (String) rs.getObject(2);
            Integer rsScore = (Integer) rs.getObject(3);
            score = new Score(rsId, rsName, rsScore);
        }
        //关闭资源
        JDBCUtils.close(con, ps, rs);
        return score;
    }

    /**
     * 修改成绩
     * 在前端对应的条目点击修改,我们将一整行信息作为Score对象传过来,修改数据库中的信息
     *
     * @param score
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static void updateScore(Score score) throws SQLException, ClassNotFoundException {
        //获取连接器
        Connection con = JDBCUtils.get();
        //获取传输器
        String sql = "update score_table set score = ? where id = ?";
        PreparedStatement ps = con.prepareStatement(sql);
        //从传入的对象中获取id,并根据id修改分数
        ps.setObject(1,score.getScore());
        ps.setObject(2,score.getId());
        //执行sql语句
        ps.executeUpdate();

        System.out.println("修改成功");//可以添加修改成功的提示信息*******

        //关闭资源
        JDBCUtils.close(con,ps,null);
    }

    /**
     * 成绩排名
     * 会先查询出所有的成绩形成一个Score集合,然后根据分数降序排列
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static List<Score> rankScore() throws SQLException, ClassNotFoundException {
        List<Score> scoreList = SQLHandler.queryAllScore();
        //将集合按照分数降序排列
        scoreList.sort((o1, o2) -> {
            if(o1.getScore()> o2.getScore()){
                return -1;
            }else{
                return 1;
            }
        });
        return scoreList;
    }

}


